/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.statusbar.policy;

import android.content.Context;
import android.content.Intent;
import android.telephony.SubscriptionInfo;

//import com.android.settingslib.net.DataUsageController;
//import com.android.settingslib.wifi.AccessPoint;
//import com.android.systemui.DemoMode;
import com.android.systemui.statusbar.policy.NetworkController.SignalCallback;

import java.util.List;

public interface NetworkController extends CallbackController<SignalCallback>/*, DemoMode */{

    boolean hasMobileDataFeature();
    void addCallback(SignalCallback cb);
    void removeCallback(SignalCallback cb);
    void setWifiEnabled(boolean enabled);
    AccessPointController getAccessPointController();
//    DataUsageController getMobileDataController();
//    DataSaverController getDataSaverController();
    String getMobileDataNetworkName();

    boolean hasVoiceCallingFeature();

    void addEmergencyListener(EmergencyListener listener);
    void removeEmergencyListener(EmergencyListener listener);
    boolean hasEmergencyCryptKeeperText();
    boolean isRadioOn();
    public int getConnectedWifiLevel();
    public int getMobileSignalLevel();
    public void setMobileDataEnabled(boolean enabled);
    public String getMobileName();
    public int getMobileNetworkType();
    public interface SignalCallback {
        default void setWifiIndicators(boolean enabled, IconState statusIcon, IconState qsIcon,
                boolean activityIn, boolean activityOut, String description, boolean isTransient,
                String statusLabel) {}

        /** M: Support [Network Type on Statusbar]
          * Add one more parameter networkIcon to signal view and show the network type beside
          * the signal.
          *  @ {*/
        default void setMobileDataIndicators(IconState statusIcon, IconState qsIcon, int statusType,
                int networkIcon, int volteType, int qsType, boolean activityIn, boolean activityOut,
                String typeContentDescription, String description, boolean isWide, int subId,
                boolean roaming, boolean isDefaultData, int customizedState) {}
        /** @ } */

        default void setSubs(List<SubscriptionInfo> subs) {}
        default void setNoSims(boolean show, boolean simDetected) {}

        default void setEthernetIndicators(IconState icon) {}

        default void setIsAirplaneMode(IconState icon) {}

        default void setMobileDataEnabled(boolean enabled) {}
    }

    public interface EmergencyListener {
        void setEmergencyCallsOnly(boolean emergencyOnly);
    }

    public static class IconState {
        public final boolean visible;
        public final int icon;
        public final String contentDescription;

        public IconState(boolean visible, int icon, String contentDescription) {
            this.visible = visible;
            this.icon = icon;
            this.contentDescription = contentDescription;
        }

        public IconState(boolean visible, int icon, int contentDescription,
                Context context) {
            this(visible, icon, context.getString(contentDescription));
        }
    }

    /**
     * Tracks changes in access points.  Allows listening for changes, scanning for new APs,
     * and connecting to new ones.
     */
    public interface AccessPointController {
        void addAccessPointCallback(AccessPointCallback callback);
        void removeAccessPointCallback(AccessPointCallback callback);
        void scanForAccessPoints();
//        int getIcon(AccessPoint ap);
//        boolean connect(AccessPoint ap);
        boolean canConfigWifi();

        public interface AccessPointCallback {
//            void onAccessPointsChanged(List<AccessPoint> accessPoints);
            void onSettingsActivityTriggered(Intent settingsIntent);
        }
    }
}
